package cn.sxt.usercenter.common.util;

import java.util.Random;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Component;


//加密的工具类
@Component("encrypUtil")
public class EncrypUtil
{
	/**
	 * 生成指定位数的随机数
	 * 
	 * @param length
	 *            长度
	 * @return 类似验证码的效果
	 */
	public String randStr(int length)
	{
		StringBuffer sb = new StringBuffer();
		Random random = new Random();
		for (int i = 0; i < length; i++)
		{
			/*
			 * 指定位数要生成字符串长度以内的随机数 长度:32,如何生成32以内的随机数?
			 */
			int randInt = random.nextInt(ConstantFinally.ALLSTR.length());
			/* 取出指定位数的字符 */
			char ch = ConstantFinally.ALLSTR.charAt(randInt);
			sb.append(ch);
		}
		return sb.toString();
	}

	/**
	 * 加密
	 * 
	 * @param souStr
	 *            原始字符串
	 * @return 加密后的字符串 sha256$随机数(盐值)$sha256(随机数(盐值)+明文)
	 */
	public String encode(String souStr)
	{
		String spli = "$";
		/* 加密算法 */
		String digType = "sha256";
		/* 随机数 */
		String rand = this.randStr(32);
		/* sha256加密的字符串 */
		String jiami = DigestUtils.sha256Hex(rand + souStr);
		/* sha256$随机数(盐值)$sha256:加密(随机数(盐值)+明文) */
		return digType + spli + rand + spli + jiami;
	}

	/**
	 * 
	 * @param souStr
	 *            原始字符串
	 * @param encodePass
	 *            加密字符串
	 * @return true:密码正确,false:密码不正确 sha256$随机数(盐值)$sha256(随机数(盐值)+明文)
	 */
	public boolean decode(String souStr, String encodePass)
	{
		/*
		 * 按照加密的流程再将原始的字符串加密即可
		 * 
		 * 
		 * sha256$yxkzUJFcGm6krT6sNOrq5C3hlCErxl9d$508ac56a16d31d8b28493512f56aacdc3bdbc82847284a890448e3271b29d12f
		 */
		String spli = "$";
		/* 加密算法 */
		String digType = "sha256";
		/* 按照$拆分 */
		String[] encodes = encodePass.split("\\" + spli);
		/* 随机数 */
		String randStr = encodes[1];
		/* 加密:sha256(随机数(盐值)+明文) */
		String jiami = DigestUtils.sha256Hex(randStr + souStr);
		/* sha256$随机数(盐值)$sha256(随机数(盐值)+明文) */
		String jiamiStr = digType + spli + randStr + spli + jiami;
		/* 比较密文 */
		return encodePass.equalsIgnoreCase(jiamiStr);
	}

	public static void main(String[] args)
	{
		EncrypUtil encryptUtil = new EncrypUtil();
		System.out.println(encryptUtil.randStr(32));

		/* 最新的加密算法 */
		String souPass = "111111";
		String jiami = encryptUtil.encode(souPass);
		System.out.println(jiami);

		/* 解密 */
		boolean flag = encryptUtil.decode(souPass, jiami);
		System.out.println(flag);
	}
}
